package com.sungrid.seine.oss.framework.util;

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.beanutils.ConversionException;
import org.apache.commons.beanutils.Converter;
import org.apache.commons.lang.StringUtils;

public class DateConverter implements Converter {
	public DateConverter() {
	}

	public Object convert(Class type, Object value) {
		
		if (value == null) {
			return null;
		}
		if (type == Timestamp.class) {
			return convertToDate(type, value, DateUtil.getDateTimePattern());
		}
		if (type == Date.class) {
			return convertToDate(type, value, DateUtil.getDatePattern());
		}
		if (type == String.class) {
			return convertToString(type, value);
		}
		if (type == String.class) {
			return convertToString(type, value);
		}
		
		if (type == Object.class) {
			return value;
		}

		throw new ConversionException("Could not convert " + value.getClass().getName() + " to " + type.getName());
	}

	protected Object convertToDate(Class type, Object value, String pattern) {
		DateFormat df = new SimpleDateFormat(pattern);
		if ((value instanceof String)) {
			try {
				if (StringUtils.isEmpty(value.toString())) {
					return null;
				}

				Date date = df.parse((String) value);
				if (type.equals(Timestamp.class)) {
					return new Timestamp(date.getTime());
				}
				return date;
			} catch (Exception pe) {
				pe.printStackTrace();
				throw new ConversionException("Error converting String to Date");
			}
		}
		if ((value instanceof Timestamp)) {
			if (type.equals(Timestamp.class)) {
				return value;
			}
			return new Date(((Timestamp) value).getTime());
		}
		if ((value instanceof Date)) {
			if (type.equals(Timestamp.class)) {
				return new Timestamp(((Date) value).getTime());
			}
			return value;
		}

		throw new ConversionException("Could not convert " + value.getClass().getName() + " to " + type.getName());
	}

	protected Object convertToString(Class type, Object value) {
		if ((value instanceof Date)) {
			DateFormat df = new SimpleDateFormat(DateUtil.getDatePattern());
			if ((value instanceof Timestamp)) {
				df = new SimpleDateFormat(DateUtil.getDateTimePattern());
			}

			try {
				return df.format(value);
			} catch (Exception e) {
				e.printStackTrace();
				throw new ConversionException("Error converting Date to String");
			}
		}

		return value.toString();
	}

}